2012-02-24 68 views
0

远程服务器调用时,我有这个类:的Android例外制作使用的AsyncTask

package com.problemio; 

import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.ArrayList; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.message.BasicNameValuePair; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

public class LoginActivity extends Activity 
{ 
    private TextView textView; 

    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.login); 

     // Show form for login_email 
     final EditText loginEmail = (EditText) findViewById(R.id.login_email); 
     String name = loginEmail.getText().toString(); 

     // Show field for password 
     final EditText password = (EditText) findViewById(R.id.password); 
     String text = password.getText().toString();     

     // Show button for submit 
     Button submit = (Button)findViewById(R.id.submit); 




     // Show options for create-profile and forgot-password 

     //readWebpage(R.layout.login) ; 


     submit.setOnClickListener(new Button.OnClickListener() 
     { 
      public void onClick(View v) 
      { 
       String email = loginEmail.getText().toString(); 
       String pass = password.getText().toString(); 
       sendFeedback(pass, email); 
      } 
     });   
    } 


    public void sendFeedback(String pass , String email) 
    { 
     Log.d("1" , pass); 
     Log.d("1" , email); 

     String[] params = new String[] { "myurl", email, pass }; 

     DownloadWebPageTask task = new DownloadWebPageTask(); 
     task.execute(params);   

     Log.d("2" , "After task.execute call"); 

    }   



    private class DownloadWebPageTask extends AsyncTask<String, Void, String> 
    { 
     @Override 
     protected String doInBackground(String... theParams) 
     { 
      Log.d("Inner class: " , "Doing stuff in background"); 

      String myUrl = theParams[0]; 
      String myEmail = theParams[1]; 
      String myPassword = theParams[2]; 

      Log.d("Inner myURL: " , myUrl); 
      Log.d("myEmail: " , myEmail); 
      Log.d("myPass: " , myPassword); 

      ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>(); 
      postParameters.add(new BasicNameValuePair("username", myEmail)); 
      postParameters.add(new BasicNameValuePair("password", myPassword));    

      String response = ""; 

      DefaultHttpClient client = new DefaultHttpClient(); 
      HttpGet httpGet = new HttpGet(myUrl); 

      try 
      { 
        HttpResponse execute = client.execute(httpGet); 
        InputStream content = execute.getEntity().getContent(); 

        BufferedReader buffer = new BufferedReader(
          new InputStreamReader(content)); 
        String s = ""; 
        while ((s = buffer.readLine()) != null) 
        { 
         response += s; 
        } 

        Log.d("After call, response: " , " " + response); 
       } 
       catch (Exception e) 
       { 
        Log.d("Exception: " , "Yup"); 
        e.printStackTrace(); 
       } 

      return response; 
     } 


     @Override 
     protected void onPostExecute(String result) 
     { 
      Log.d("Post execute: " , "In the post-execute method"); 
      textView.setText(result); 
     }  
    } 

     public void readWebpage(View view) 
     { 
      Log.d("Read webpage: " , "In the read webpage method"); 
      DownloadWebPageTask task = new DownloadWebPageTask(); 
      task.execute(new String[] { "myurl" }); 
     }  
} 

,当我叫它,它不跑,打远程服务器,并挑选了一切该服务器的输出。所以这没有问题。

的问题是,它创建了一个NullPointerException异常呼叫作出后,返回来自服务器的响应:

02-23 17:01:44.607: E/AndroidRuntime(2018): FATAL EXCEPTION: main 
02-23 17:01:44.607: E/AndroidRuntime(2018): java.lang.NullPointerException 
02-23 17:01:44.607: E/AndroidRuntime(2018):  at com.problemio.LoginActivity$DownloadWebPageTask.onPostExecute(LoginActivity.java:137) 
02-23 17:01:44.607: E/AndroidRuntime(2018):  at com.problemio.LoginActivity$DownloadWebPageTask.onPostExecute(LoginActivity.java:1) 
02-23 17:01:44.607: E/AndroidRuntime(2018):  at android.os.AsyncTask.finish(AsyncTask.java:602) 
02-23 17:01:44.607: E/AndroidRuntime(2018):  at android.os.AsyncTask.access$600(AsyncTask.java:156) 
02-23 17:01:44.607: E/AndroidRuntime(2018):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615) 
02-23 17:01:44.607: E/AndroidRuntime(2018):  at android.os.Handler.dispatchMessage(Handler.java:99) 
02-23 17:01:44.607: E/AndroidRuntime(2018):  at android.os.Looper.loop(Looper.java:137) 
02-23 17:01:44.607: E/AndroidRuntime(2018):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
02-23 17:01:44.607: E/AndroidRuntime(2018):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-23 17:01:44.607: E/AndroidRuntime(2018):  at java.lang.reflect.Method.invoke(Method.java:511) 
02-23 17:01:44.607: E/AndroidRuntime(2018):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
02-23 17:01:44.607: E/AndroidRuntime(2018):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
02-23 17:01:44.607: E/AndroidRuntime(2018):  at dalvik.system.NativeStart.main(Native Method) 

此外,什么是获得回报的呼叫后做的最正确的事情吗?我应该只是做一个意图,并去一个不同的活动屏幕?

谢谢!

回答

1

textView.setText(result);onPostExecute方法中,textview从不初始化。

如果你想通知另一个活动,你可以设置数据意图调用另一个活动,或发送广播。

+0

你是什么意思,它从来没有启动?它应该做什么? :)它应该以某种方式初始化?我不知道应该发生什么:) – GeekedOut 2012-02-24 01:57:18

+0

textview需要init在使用之前,所以在'setContentView(R.layout.login)'下面,你需要像这样的'textview =(TextView)findViewById(yourTextViewid) – idiottiger 2012-02-24 01:59:50

0

通过调用初始化textView:textView = (TextView)findViewById(yourId); 并且如果取消任务,结果可能为null。