2016-09-25 76 views
0

有几天我一直在试图找出Android Studio上的这个多线程的东西。我以前只使用过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的一个很好的做法。使用Core Java线程,就像我在运行方法中使用的一样,或者使用其他的Android后台机制,如AsyncTask/IntentService。

+0

非常感谢!就像你发布的那样,我设法让AyncTask工作,尽管它和我昨天尝试的代码完全相同。现在它的工作没有明显的原因。 – Remixt

+0

听起来不错,但异步任务也有一个主要缺陷,这里提到https://developer.android.com/guide/components/processes-and-threads.html所以,如果你是在AsyncTask的谨慎下,那么更好地使用Core Java线程通过定义任何执行程序或使用IntentService。 – EEJ