2013-04-23 339 views
0

Android客户端在Android 2.2上运行时没有问题。但在Android 4.2中,我需要使用AsyncTask,并且我不知道如何正确设置它。在按钮上,客户端应该连接到TCP服务器。我试过它作为下面的代码,但我得到致命的异常:AsyncTask#1错误。请你看看我的代码!谢谢。buttonConnectOnClickListener,致命异常:AsyncTask#1

// ----------------------- CONNECTION BUTTON EVENTLISTENER - begin ---------------------------- 
Button.OnClickListener buttonConnectOnClickListener = new Button.OnClickListener(){ 
@Override 
public void onClick(View arg0) { 



class connectTask extends AsyncTask<String, String, AndroidClientActivity> { 
@Override 
protected AndroidClientActivity doInBackground(String... message) { 





    if(!connected){//if not connected yet 
    outputText("connecting to Server"); 
    try {//try to create a socket and outputstream 
    socket = new Socket("192.168.1.112",5353);//create a socket 
    dataOutputStream = new DataOutputStream(socket.getOutputStream());//and stream 
    outputText("successfully connected");//output the connection status 
    changeConnectionStatus(true);//change the connection status 
    } catch (UnknownHostException e) {//catch and 
    outputText(e.getMessage());//display errors 
    changeConnectionStatus(false); 
    } catch (IOException e) {//catch and 
    outputText(e.getMessage());//display errors 
    changeConnectionStatus(false); 
    } 
    }else{ 
    outputText("disconnecting from Server..."); 
    try {//try to close the socket 
    socket.close(); 
    outputText("successfully disconnected"); 
    changeConnectionStatus(false);//change the connection status 
    } catch (UnknownHostException e) {//catch and 
    outputText(e.getMessage());//display errors 
    } catch (IOException e) {//catch and 
    outputText(e.getMessage());//display errors 
    } 
    } 




    return null; 
    } 

    @Override 
    protected void onPostExecute(AndroidClientActivity jh) { 



    }} 
       new connectTask().execute();    
      } 
     }; 

这是错误我geting;

04-23 23:27:30.445: E/AndroidRuntime(12005): FATAL EXCEPTION: AsyncTask #1 
04-23 23:27:30.445: E/AndroidRuntime(12005): java.lang.RuntimeException: An error occured while executing doInBackground() 
04-23 23:27:30.445: E/AndroidRuntime(12005): at android.os.AsyncTask$3.done(AsyncTask.java:278) 
04-23 23:27:30.445: E/AndroidRuntime(12005): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
04-23 23:27:30.445: E/AndroidRuntime(12005): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
04-23 23:27:30.445: E/AndroidRuntime(12005): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
04-23 23:27:30.445: E/AndroidRuntime(12005): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
04-23 23:27:30.445: E/AndroidRuntime(12005): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 
04-23 23:27:30.445: E/AndroidRuntime(12005): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
04-23 23:27:30.445: E/AndroidRuntime(12005): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
04-23 23:27:30.445: E/AndroidRuntime(12005): at java.lang.Thread.run(Thread.java:856) 
04-23 23:27:30.445: E/AndroidRuntime(12005): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
04-23 23:27:30.445: E/AndroidRuntime(12005): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4039) 
04-23 23:27:30.445: E/AndroidRuntime(12005): at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:709) 
04-23 23:27:30.445: E/AndroidRuntime(12005): at android.view.View.requestLayout(View.java:12863) 
04-23 23:27:30.445: E/AndroidRuntime(12005): at android.view.View.requestLayout(View.java:12863) 
04-23 23:27:30.445: E/AndroidRuntime(12005): at android.view.View.requestLayout(View.java:12863) 
04-23 23:27:30.445: E/AndroidRuntime(12005): at android.view.View.requestLayout(View.java:12863) 
04-23 23:27:30.445: E/AndroidRuntime(12005): at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:273) 
04-23 23:27:30.445: E/AndroidRuntime(12005): at android.view.View.requestLayout(View.java:12863) 
04-23 23:27:30.445: E/AndroidRuntime(12005): at android.widget.TextView.checkForRelayout(TextView.java:6985) 
04-23 23:27:30.445: E/AndroidRuntime(12005): at android.widget.TextView.setText(TextView.java:3333) 
04-23 23:27:30.445: E/AndroidRuntime(12005): at android.widget.TextView.setText(TextView.java:3189) 
04-23 23:27:30.445: E/AndroidRuntime(12005): at android.widget.TextView.append(TextView.java:2849) 
04-23 23:27:30.445: E/AndroidRuntime(12005): at android.widget.TextView.append(TextView.java:2839) 
04-23 23:27:30.445: E/AndroidRuntime(12005): at com.rovercontrollerandroid.AndroidClientActivity.outputText(AndroidClientActivity.java:249) 
04-23 23:27:30.445: E/AndroidRuntime(12005): at com.rovercontrollerandroid.AndroidClientActivity$3$1connectTask.doInBackground(AndroidClientActivity.java:192) 
04-23 23:27:30.445: E/AndroidRuntime(12005): at com.rovercontrollerandroid.AndroidClientActivity$3$1connectTask.doInBackground(AndroidClientActivity.java:1) 
04-23 23:27:30.445: E/AndroidRuntime(12005): at android.os.AsyncTask$2.call(AsyncTask.java:264) 
04-23 23:27:30.445: E/AndroidRuntime(12005): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
04-23 23:27:30.445: E/AndroidRuntime(12005): ... 5 more 
+1

请格式化你的代码,以便它是可读的时你发布在StackOverflow上。 – Squonk 2013-04-23 22:42:00

回答

1

不要试图从AsyncTaskdoInBackground(...)访问任何UI组件。

错误发生在logcat “只有创建视图层次结构的原始线程可以触及其视图。”

doInBackground(...)方法运行在不同的线程上。如果要显示进度,请将代码移至onProgressUpdate(...),并使用doInBackground(...)中的publishProgress(...)

doInBackground(...)完成后需要访问UI的任何其他代码应该进入onPostExecute(...)

0

从您的logcat,它看起来像outputText()是一个函数,它不会UI操作。看起来你想显示进度。使用publishProgress()更新AsyncTaskonProgressUpdate()方法。你不能做UI操作中doInBackground()

一个简短的例子是

class connectTask extends AsyncTask<String, String, AndroidClientActivity> { 
    ProgressDialog progress = new ProgressDialog(MainActivity.this); //create progress dialog 

@Override 
protected AndroidClientActivity doInBackground(String... message) { 
    publishProgress("message to send"); // put this wherever you are trying to show a message while attempting to download 

然后实现

@Override 
protected void onProgressUpdate(String... values) { 
    progress.setTitle("Trying"); 
    progress.setMessage(values[0]); // this will be the value set in `publishProgress() of doINBackground() 
    progress.show(); 
} 

然后调用progress.dismiss()onPostExecute()

相关问题