2017-02-06 60 views
0

我是native android开发的新手。我正在致力于android studio。我已经创造了mysql一个web service api使用yii,也是我创建了两个表名为UsersActivity,输入了一些数据到User表像下面在android studio中使用REST api获取用户名的用户名

enter image description here

现在我想的是,只要用户输入的的id用户应该显示具体的username

为此,我跟着这个堆栈link和制造布局

<EditText 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:inputType="textPersonName|number" 
    android:ems="10" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:id="@+id/etId" 
    style="@style/Widget.AppCompat.EditText" /> 

<Button 
    android:text="Submit" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentEnd="true" 
    android:id="@+id/btn_Submit" 
    android:layout_alignBottom="@+id/etId" /> 

<TextView 
    android:text="TextView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="53dp" 
    android:id="@+id/textView" 
    android:textAppearance="@style/TextAppearance.AppCompat.Display1" 
    android:layout_below="@+id/etId" 
    android:layout_centerHorizontal="true" /> 

我要显示的文字名称。

根据我所遵循的链接,但无法查看我所需的结果。

public class MainActivity extends AppCompatActivity { 

String URL = "http://localhost:8000/app/web/users/"; 
String result = ""; 

TextView tv; public static final String LOG_TAG = MainActivity.class.getSimpleName();

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 


    final EditText editText = (EditText)findViewById(R.id.etId); 

    /*editText.setOnClickListener(new EditText.OnClickListener(){ 

     @Override 
     public void onClick(View v) { 
      editText.setText(" "); 
     } 
    }); 
    */ 
    final Button button = (Button)findViewById(R.id.btn_Submit); 

    button.setOnClickListener(new Button.OnClickListener(){ 

     @Override 
     public void onClick(View v) { 
      String query = editText.getText().toString(); 
      callWebService(query); 
     } 
    }); 

} 

private void callWebService(String q) { 

    HttpClient httpclient = new DefaultHttpClient(); 

    HttpGet request = new HttpGet(URL + q); 

    ResponseHandler<String> handler = new BasicResponseHandler(); 

    try 
    { 
     result = httpclient.execute(request, handler); 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    httpclient.getConnectionManager().shutdown(); 
    tv = (TextView)findViewById(R.id.textView); 

    Toast.makeText(LOG_TAG, "Hi", result).show(); 
    //tv.append("Hi ", result, ":"); 
} 

更新1

下面是当我点击按钮

android.os.NetworkOnMainThreadException 
                       at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147) 
                       at java.net.InetAddress.lookupHostByName(InetAddress.java:418) 
                       at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252) 
                       at java.net.InetAddress.getAllByName(InetAddress.java:215) 
                       at com.android.okhttp.HostResolver$1.getAllByName(HostResolver.java:29) 
                       at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:232) 
                       at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:124) 
                       at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:272) 
                       at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211) 
                       at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:382) 
                       at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:332) 
                       at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:500) 
                       at com.example.accurat.webservice.MainActivity$1.onClick(MainActivity.java:53) 
                       at android.view.View.performClick(View.java:4780) 
                       at android.view.View$PerformClick.run(View.java:19866) 
                       at android.os.Handler.handleCallback(Handler.java:739) 
                       at android.os.Handler.dispatchMessage(Handler.java:95) 
                       at android.os.Looper.loop(Looper.java:135) 
                       at android.app.ActivityThread.main(ActivityThread.java:5254) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at java.lang.reflect.Method.invoke(Method.java:372) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

这是我得到的错误而它是在点

`button.setOnClickListener(新按钮.OnClickListener(){

 @Override 
     public void onClick(View v) { 
      String query = editText.getText().toString(); 
      callWebService(query); 
     } 
    });` 

更新2

按照此link我已经做了以下

if (android.os.Build.VERSION.SDK_INT > 9) 
    { 
     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
     StrictMode.setThreadPolicy(policy); 
    } 

现在我的应用程序不会崩溃,但它只是告诉我HI,而不是所请求的数据

虽然调试它,我得到异常 org.apache.http.conn.HttpHostConnectException: Connection to http://localhost:8000 refused

虽然当我要求它在我的浏览器。它只表示我需要的结果作为显示在下面的图像

enter image description here

注:

我模拟器上测试它。

任何帮助将不胜感激。

+1

你得到什么错误? –

+0

你的yii API是否按预期工作? – Shadow

+0

@ M.WaqasPervez请看我的'update 1' – faisal1208

回答

0

NetworkOnMainThreadException只有当您使用的主要话题网页操作发生。在AsyncTask或其他Thread运行代码:

new Thread(new Runnable(){ 
    @Override 
    public void run() { 
    // Do network action in this function 
    } 
}).start(); 

检查了这一点更多关于NetworkOnMainThreadException

-

简单地说,

DO NOT DO网络工作在UI线程

如果你用简单的线程,当你得到的东西来自网络响应并希望将其显示在视图上(如TextView中的显示响应消息),则需要返回到UI线程。如果你不这样做,你会得到ViewRootImpl$CalledFromWrongThreadException

因此,对于新手我会建议AssyncTask

UPDATE

http://localhost

以上主机已经被模拟器在其上运行的代码所占据。如果要访问计算机的本地主机,请使用IP地址http://yourip:8080/.

有关更多详细信息,请参阅此link

+0

请参阅我的'更新2' – faisal1208

+0

查看更新回答 –

+0

当我点击提交按钮时,我的应用程序停止工作 – faisal1208

0

你应该:

  1. 应用Internet权限上的Manifest.xml
  2. 网络不应在主运行thread.you应该这样做对其他线程
  3. 你可以选择第三方lib中,以简化网络请求,如Volley或Retrofit
+0

请看我的'update 2' – faisal1208

+0

我是你的HttpClient用法是错误的 –

+0

请问你能否正确的告诉我? – faisal1208

0

Android通常不支持localhost作为URL,因为大多数计算机通过WiFi或其他网络连接。尝试用您的系统的IPADDRESS替换localhost。像:

String URL = "http://192.168.1.1:8000/app/web/users/"; //replace 192.168.1.1 with your ip address 
+0

当我点击提交按钮时,我的应用程序无法工作 – faisal1208

相关问题