2016-09-11 2 views
1

Я пытаюсь сохранить некоторые данные в базе данных mysql, используя мое приложение для Android. Я использую okhttp3 отправить запрос, но ошибка кажется мне на этой линии:android OkHttpClient Requesting Error

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)  
+0

вы должны перенести и отметить ответ, который, по вашему мнению, является правильным. Это заставит больше людей помочь вам в такие моменты, как StackOverflow. #SOBeginnerTips – karthiks

ответ

3

сообщение об ошибке говорит, что это все:

Вызванный: 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 делает его легче для нас, чтобы сделать асинхронные запросы с использованием enqueue method:

client.newCall(request).enqueue(new Callback() { 
    @Override 
    public void onFailure(Call call, IOException e) { 
     e.printStackTrace(); 
    } 

    @Override 
    public void onResponse(Call call, final Response response) throws IOException { 
     if (!response.isSuccessful()) { 
      throw new IOException("Unexpected code " + response); 
     } 

     // you code to handle response 
    } 
); 
0

Вот как вам следует отлаживать ваш код: Ваша первая запись в журнале, которая заявляет,

java.lang.IllegalStateException: Не удалось выполнить метод андроида: OnClick

говорит вам, что есть что-то не так с вами реализация метода OnClick, который в данном случае является clicking(View view). Затем вы идете на охоту за следующую подсказку, что ваш второй сигнал в журнале, который гласит,

Вызванные: android.os.NetworkOnMainThreadException

и это, конечно, происходит в ваших clicking(View view) который вы указали. Он делает сетевой запрос из основного потока; и oh !, система Android считает, что это плохо.

Итак, каков выход? Вы можете использовать любой из следующих способов: альтернативы

Альтернатива 1: View.post (Runnable) или View.postDelayed (Runnable, длинный)

Альтернатива 2: Activity.runOnUiThread (Runnable)

Alternative 3: Обработчик

Альтернатива 4: AsyncTask

Я предназначалась каждой из этих альтернатив, в том числе неправильный путь, как тот, который вы демонстрировались в моем проекте Github под названием, DemoThreadsAndProcesses. Пожалуйста, не стесняйтесь (fork и) загружать его и играть с ним, чтобы увидеть, какая альтернатива реализации соответствует вашим интересам и пойдет об использовании этого в вашем собственном самом проекте.

Для быстрой проверки, я буду идти о реализации ваших clicking(View view), как показано ниже:

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) {} 
} 

Надежда, что помогает!

Смежные вопросы