Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java android OkHttpClient请求错误_Java_Android_Mysql_Okhttp_Okhttp3 - Fatal编程技术网

Java android OkHttpClient请求错误

Java android OkHttpClient请求错误,java,android,mysql,okhttp,okhttp3,Java,Android,Mysql,Okhttp,Okhttp3,我正在尝试使用我的android应用程序在mysql数据库中存储一些数据。我正在使用okhttp3发送请求,但在此行中出现错误: client.newCall(request).execute(); 我在本地机器上和网上都试过了,但它给了我同样的错误,这里是代码 public class MainActivity extends AppCompatActivity { String token1; @Override protected void onCreate(

我正在尝试使用我的android应用程序在mysql数据库中存储一些数据。我正在使用okhttp3发送请求,但在此行中出现错误:

client.newCall(request).execute();
我在本地机器上和网上都试过了,但它给了我同样的错误,这里是代码

public class MainActivity extends AppCompatActivity {

    String token1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        System.out.println("MainActivity is :" + FirebaseInstanceId.getInstance().getToken());
        FirebaseMessaging.getInstance().subscribeToTopic("test");
        FirebaseInstanceId.getInstance().getToken();
        token1=FirebaseInstanceId.getInstance().getToken();
    }

    public void clicking(View view) {

        OkHttpClient client = new OkHttpClient();
        RequestBody body = new FormBody.Builder()
                .add("Token",token1)
                .build();

        okhttp3.Request request = new okhttp3.Request.Builder()
                .url("http://saleh923.byethost8.com/hii.html")
                .post(body)
                .build();

        try {
            client.newCall(request).execute();
        } catch (IOException e) {

            e.printStackTrace();
        }
    }
}
下面是日志:

 com.example.user.firebasenot E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.user.firebasenot, PID: 3280
    java.lang.IllegalStateException: Could not execute method for android:onClick
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293)
        at android.view.View.performClick(View.java:5198)
        at android.view.View$PerformClick.run(View.java:21147)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
        at android.view.View.performClick(View.java:5198) 
        at android.view.View$PerformClick.run(View.java:21147) 
        at android.os.Handler.handleCallback(Handler.java:739) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:148) 
        at android.app.ActivityThread.main(ActivityThread.java:5417) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
     Caused by: android.os.NetworkOnMainThreadException
        at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
        at java.net.InetAddress.lookupHostByName(InetAddress.java:431)
        at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
        at java.net.InetAddress.getAllByName(InetAddress.java:215)
        at okhttp3.Dns$1.lookup(Dns.java:39)
        at okhttp3.internal.connection.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:172)
        at okhttp3.internal.connection.RouteSelector.nextProxy(RouteSelector.java:138)
        at okhttp3.internal.connection.RouteSelector.next(RouteSelector.java:80)
        at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:178)
        at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:129)
        at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:98)
        at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
        at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:109)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
        at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
        at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:124)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
        at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:170)
        at okhttp3.RealCall.execute(RealCall.java:60)
        at com.example.user.firebasenot.MainActivity.clicking(MainActivity.java:54)
        at java.lang.reflect.Method.invoke(Native Method) 
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
        at android.view.View.performClick(View.java:5198) 
        at android.view.View$PerformClick.run(View.java:21147) 
        at android.os.Handler.handleCallback(Handler.java:739) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:148) 
        at android.app.ActivityThread.main(ActivityThread.java:5417) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

错误消息说明了这一切:

原因:android.os.NetworkOnMainThreadException

您不应该在主(又名UI)线程上发出网络请求。
您可以通过多种方式在不同的线程上发出此请求,以下是一种:

final OkHttpClient client = new OkHttpClient();
RequestBody body = new FormBody.Builder()
        .add("Token",token1)
        .build();

final okhttp3.Request request = new okhttp3.Request.Builder()
        .url("http://saleh923.byethost8.com/hii.html")
        .post(body)
        .build();

final Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            client.newCall(request).execute();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
});
但是,
okhttp
使我们可以更轻松地使用:


以下是调试代码的方法: 你在日志中的第一个提示是

java.lang.IllegalStateException:无法执行的方法 安卓:onClick

告诉您onClick方法实现有问题,在本例中是
单击(视图)
。然后你继续寻找下一个提示,这是你在日志中的第二个提示

原因:android.os.NetworkOnMainThreadException

这当然发生在您指出的
单击(查看)
方法实现行中。它从主线程发出网络请求;哦!,安卓系统认为这是一件坏事

那么出路是什么呢?您可以使用以下任一替代方法:

备选方案1:View.post(可运行)或View.postDelayed(可运行,长)

备选方案2:Activity.runOnUiThread(可运行)

备选方案3:处理程序

备选方案4:异步任务

我已经演示了这些备选方案中的每一个,包括错误的方式,就像您在我的Github项目中展示的名为。请随意下载并使用它,看看哪个实现方案适合您的兴趣,并在您自己的项目中使用它

为了快速检查,我将实现您的
单击(查看)
如下所示:

public void clicking(View view) {
   new MakeNetworkRequestAsyncTask().execute();
}

private void makeNetworkRequest() {
    OkHttpClient client = new OkHttpClient();
        RequestBody body = new FormBody.Builder()
                .add("Token",token1)
                .build();

        okhttp3.Request request = new okhttp3.Request.Builder()
                .url("http://saleh923.byethost8.com/hii.html")
                .post(body)
                .build();

        try {
            client.newCall(request).execute();
        } catch (IOException e) {
            e.printStackTrace();
        }
}

private class MakeNetworkRequestAsyncTask extends AsyncTask<Void, Void, Void> {
   // The system calls this to perform work in a worker thread and
   // delivers it the parameters given to AsyncTask.execute()
   protected transient Void doInBackground(Void[] params) {
      makeNetworkRequest();
   }

   // The system calls this to perform work in the UI thread and
   // delivers the result from doInBackground() method defined above
   @Override
   protected void onPostExecute(Void result) {}
}
公共作废点击(查看){
新建MakeNetworkRequestAsyncTask().execute();
}
私有void makeNetworkRequest(){
OkHttpClient=新的OkHttpClient();
RequestBody=newformbody.Builder()
.添加(“令牌”,令牌1)
.build();
okhttp3.Request-Request=新的okhttp3.Request.Builder()
.url(“http://saleh923.byethost8.com/hii.html")
.职位(机构)
.build();
试一试{
client.newCall(request.execute();
}捕获(IOE异常){
e、 printStackTrace();
}
}
私有类MakeNetworkRequestAsyncTask扩展了AsyncTask{
//系统调用它以在工作线程中执行工作,并
//将给定给AsyncTask.execute()的参数传递给它
受保护的瞬态Void doInBackground(Void[]参数){
makeNetworkRequest();
}
//系统调用它来执行UI线程中的工作,并
//从上面定义的doInBackground()方法传递结果
@凌驾
受保护的void onPostExecute(void result){}
}

希望有帮助

你应该投票并标出你认为正确的答案。这将使更多的人在StackOverflow这样的时候帮助你#SOBeginnerTips
public void clicking(View view) {
   new MakeNetworkRequestAsyncTask().execute();
}

private void makeNetworkRequest() {
    OkHttpClient client = new OkHttpClient();
        RequestBody body = new FormBody.Builder()
                .add("Token",token1)
                .build();

        okhttp3.Request request = new okhttp3.Request.Builder()
                .url("http://saleh923.byethost8.com/hii.html")
                .post(body)
                .build();

        try {
            client.newCall(request).execute();
        } catch (IOException e) {
            e.printStackTrace();
        }
}

private class MakeNetworkRequestAsyncTask extends AsyncTask<Void, Void, Void> {
   // The system calls this to perform work in a worker thread and
   // delivers it the parameters given to AsyncTask.execute()
   protected transient Void doInBackground(Void[] params) {
      makeNetworkRequest();
   }

   // The system calls this to perform work in the UI thread and
   // delivers the result from doInBackground() method defined above
   @Override
   protected void onPostExecute(Void result) {}
}