2016-09-25 5 views
0

私は数日間、このマルチスレッドのことをAndroidスタジオで把握しようとしていました。私は過去にSwingWorkerを使用しましたが、私の髪を引っ張っているメインスレッドからhttps接続を開始するいくつかの方法を試してみました。私は、ASyncTaskを使用してから接続が確立されるたびにスレッドを開始するまで、何も試してみましたが、何も動作していないようです。私のアプリは毎回クラッシュします。最新の試みは以下の通りです。メインスレッドからタスクを実行しようとしています。このソースコードはこれを実行していますか?

編集:重複していません。私はそのスレッドを読みましたが、この問題を解決するために何もしません。私はメインスレッドの外でこのタスクを実行しようとしていますが、run()のバックグラウンドスレッドに変更したので、なぜ私のコードがそれをしていないのか分かりません。場合によっては新しいスレッドを開始することさえできます。

public class YelpActivity extends AppCompatActivity implements Runnable{ 
     private yelpLoader load; 

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



    } 
    public void run(){ 
     Thread t = new Thread(); 
     t.start(); 
     android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND); 
     YelpAPI test = new YelpAPI(); 
     test.run(); 

    } 

     public void yelpClick(View v){ 
      run(); 

     changeYelpResults(v,"test"); 


    } 


    private void changeYelpResults(View v, String text){ 

     TextView t = (TextView) findViewById(R.id.ResturauntID); 
     t.setText(text); 

    } 



} 

エラーログ:

E/AndroidRuntime: FATAL EXCEPTION: main 
        Process: tastr.tastr, PID: 3560 
        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: org.scribe.exceptions.OAuthConnectionException: There was a problem while creating a connection to the remote service. 
         at org.scribe.model.Request.send(Request.java:70) 
         at org.scribe.model.Request.send(Request.java:76) 
         at tastr.tastr.YelpAPI.sendRequestAndGetResponse(YelpAPI.java:132) 
         at tastr.tastr.YelpAPI.searchForBusinessesByLocation(YelpAPI.java:89) 
         at tastr.tastr.YelpAPI.queryAPI(YelpAPI.java:146) 
         at tastr.tastr.YelpAPI.run(YelpAPI.java:190) 
         at tastr.tastr.YelpActivity.run(YelpActivity.java:26) 
         at tastr.tastr.YelpActivity.yelpClick(YelpActivity.java:31) 
         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 com.android.okhttp.internal.Network$1.resolveInetAddresses(Network.java:29) 
         at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:188) 
         at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:157) 
         at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:100) 
         at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:357) 
         at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:340) 
         at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:330) 
         at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:248) 
         at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:433) 
         at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:114) 
         at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.connect(DelegatingHttpsURLConnection.java:89) 
         at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java) 
         at org.scribe.model.Response.<init>(Response.java:29) 
         at org.scribe.model.Request.doSend(Request.java:117) 
         at org.scribe.model.Request.send(Request.java:66) 
         at org.scribe.model.Request.send(Request.java:76)  
         at tastr.tastr.YelpAPI.sendRequestAndGetResponse(YelpAPI.java:132)  
         at tastr.tastr.YelpAPI.searchForBusinessesByLocation(YelpAPI.java:89)  
         at tastr.tastr.YelpAPI.queryAPI(YelpAPI.java:146)  
         at tastr.tastr.YelpAPI.run(YelpAPI.java:190)  
         at tastr.tastr.YelpActivity.run(YelpActivity.java:26)  
         at tastr.tastr.YelpActivity.yelpClick(YelpActivity.java:31)  
         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)  
+1

[NetworkOnMainThreadException]の可能な複製(http://stackoverflow.com/questions/5150637/networkonmainthreadexception) – Onik

+0

重複していません。私はそのスレッドを読みましたが、この問題を解決するために何もしません。私はメインスレッドの外でこのタスクを実行しようとしていますが、run()のバックグラウンドスレッドに変更したので、なぜ私のコードがそれをしていないのか分かりません。場合によっては新しいスレッドを開始することさえできます。 – Remixt

+0

'YelpAPI.run()'が何をしているのか分かりませんが、メソッド内で新しいスレッドを開始しないと(stacktraceが私に正しいと伝えます)、問題は重複しています。メインスレッドでネットワーク操作を実行するため、例外が発生します。 – Onik

答えて

1

パブリッククラスYelpActivityはAppCompatActivity { プライベートyelpLoader負荷を拡張します。

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



} 
public void run(){ 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       YelpAPI test = new YelpAPI(); 
       test.run();   
      } 
     }).start(); 
    } 
    public void yelpClick(View v){ 
     run(); 

    changeYelpResults(v,"test"); 


} 


private void changeYelpResults(View v, String text){ 

    TextView t = (TextView) findViewById(R.id.ResturauntID); 
    t.setText(text); 

} 

}

注:これは、活動 クラスでRunnableを実装することをお勧めではありません。実行メソッドで行ったようなコアJavaスレッドを使用するか、AsyncTask/IntentServiceのようなその他の Androidのバックグラウンドメカニズムを使用します。

+0

ありがとうございました!あなたがこれを投稿したのと同じように、私は昨日試した全く同じコードでも、AyncTaskを動作させることができました。今は明白な理由がないために働いています。 – Remixt

+0

いいですが、非同期タスクには、ここで言及されている大きな欠陥があります。https://developer.android.com/guide/components/processes-and-threads.html AsyncTaskの注意の下にある場合は、コア任意のエグゼキュータを定義してJavaスレッドを作成するか、IntentServiceを使用します。 – EEJ

関連する問題