2012-06-08 48 views
3

嗨,我已经创建了一个AsyncTask,从网站加载数据,然后当我执行它。此刻我得到一个空指针异常,我认为是因为我想太早填充用户界面,所以我希望能够创建某种if语句,说如果AsyncTask未完成显示加载图形和填充数据的时间。但我不知道如何去做这件事,没有人知道我该如何实现这一目标,或者至少将我指向正确的方向。Android AsyncTask检测是否完成

继承人到目前为止我的代码

public void checkPreferences(){ 

     SharedPreferences preferences = getSharedPreferences("prefs", Context.MODE_PRIVATE); 
     ChosenMethod = preferences.getString("ChosenMethod", ChosenMethod); 
     ChosenLeagueID = preferences.getString("ChosenLeagueId", ChosenLeagueID); 
     ChosenTeamId = preferences.getString("ChosenTeamId", ChosenTeamId); 

     Log.v("lc", "newsurl" + newsFeedURL); 


     Log.v("myapp", "ChosenMethod Home = " + ChosenMethod); 
     Log.v("myapp", "ChosenLeagueID Home = " + ChosenLeagueID); 
     Log.v("myapp", "ChosenTeamID Home = " + ChosenTeamId); 

     if (ChosenMethod.equals("Team")) { 
      setContentView(R.layout.homeactteam2); 
      newsAmount = 5; 

     } else { 
      newsAmount = 10; 
      setContentView(R.layout.homeactteam); 
     } 

} 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 

    //Check Preferences which sets UI 

    checkPreferences(); 
    PostTask posttask; 
    posttask = new PostTask(); 
    posttask.execute(); 

    FillData(); 


    Button backbtn = (Button) findViewById(R.id.backbtn); 

    //Listening to button event 
    backbtn.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View arg0) { 
      //Starting a new Intent 
      Intent previousScreen = new Intent(getApplicationContext(), ChooseTeamActivity.class); 
      ChosenMethod = "null"; 
      SharedPreferences preferences = getSharedPreferences("prefs", Context.MODE_PRIVATE); 
      SharedPreferences.Editor editor = preferences.edit(); 
      editor.putString("ChosenMethod", ChosenMethod);    
      editor.commit(); 
      previousScreen.putExtra("FullData", fulldata); 
      startActivity(previousScreen); 


     } 
    }); 

//((PullToRefreshListView) getListView()).setOnRefreshListener(new OnRefreshListener() { 
// 
// public void onRefresh() { 
//  // Do work to refresh the list here. 
//  loadData(); 
// } 
//}); 
// 


} 



public void loadNewsFeed(){ 

    newsFeedRequest = "website/" + chosenLeagueId + "/news?timestamp=" + unixTimeStamp; 
    newsFeedURL = "https://www.website.com" + newsFeedRequest; 

     String myhash = buildHmacSignature(apiKey, newsFeedURL); 
     HttpClient client = new DefaultHttpClient(); 
     HttpPost post = new HttpPost(newsFeedURL); 

     List<NameValuePair> pairs = new ArrayList<NameValuePair>(); 
     pairs.add(new BasicNameValuePair("requestToken", myhash)); 
     pairs.add(new BasicNameValuePair("apiUser", apiUser)); 

      try { 
       post.setEntity (new UrlEncodedFormEntity(pairs)); 
       HttpResponse response = client.execute(post); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8")); 
       String json = reader.readLine(); 
       fulldata = String.valueOf(json); 
       Log.v("myApp","newsdata" + fulldata); 

       newsList = new ArrayList<String>(); 
       newsList2 = new ArrayList<String>(); 
       newsList3 = new ArrayList<String>(); 
       imageList = new ArrayList<String>(); 


       JSONObject obj = new JSONObject(json);  
       JSONObject objData = obj.getJSONObject("data"); 
       JSONArray jArray = objData.getJSONArray("news"); 
       Log.v("lc","newsAmount= " + newsAmount); 

        for(int t = 0; t < newsAmount; t++){ 
         JSONObject newsTitleDict = jArray.getJSONObject(t); 
         imageList.add(newsTitleDict.getString("image_small")); 
        newsList3.add(newsTitleDict.getString("title")); 

        } 

        for(int t = 0; t < 1; t++){ 
         JSONObject newsTitleDict = jArray.getJSONObject(t); 

       newsList.add(newsTitleDict.getString("title")); 
      //  newsList2.add(newsTitleDict.getString("title")); 

        } 



    } catch (ClientProtocolException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 


}   


public void loadResultsFeed(){ 


    resultsFeedRequest = "website/" + chosenLeagueId + "/results?&team_id=" + ChosenTeamId + "&limit=31&timestamp=" + unixTimeStamp; 
    resultsFeedURL = "https://www.website.com" + resultsFeedRequest;  

    String myhash = buildHmacSignature(apiKey, resultsFeedURL); 

    HttpClient client = new DefaultHttpClient(); 
    HttpPost post = new HttpPost(resultsFeedURL); 

    List<NameValuePair> pairs = new ArrayList<NameValuePair>(); 
    pairs.add(new BasicNameValuePair("requestToken", myhash)); 
    pairs.add(new BasicNameValuePair("apiUser", apiUser)); 

    try { 
     post.setEntity (new UrlEncodedFormEntity(pairs)); 
     HttpResponse response = client.execute(post); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8")); 
     String json = reader.readLine(); 
     fulldata = String.valueOf(json); 
     Log.v("myApp","resultsdata" + fulldata); 

     newsList = new ArrayList<String>(); 
     newsList2 = new ArrayList<String>(); 
     newsList3 = new ArrayList<String>(); 
     imageList = new ArrayList<String>(); 


     JSONObject obj = new JSONObject(json);  
     JSONObject objData = obj.getJSONObject("data"); 
     JSONArray jArray = objData.getJSONArray("results"); 


     if(jArray.length() < 1) loadLastResults(); 



    } catch (ClientProtocolException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 


} 


public void loadLastResults(){ 

    resultsFeedRequest = "website/" + chosenLeagueId + "/results?month=04&team_id=" + ChosenTeamId + "&limit=31&timestamp=" + unixTimeStamp; 
    resultsFeedURL = "https://www.website.com" + resultsFeedRequest;  

    String myhash = buildHmacSignature(apiKey, resultsFeedURL); 

    Date anotherCurDate = new Date(); 
    SimpleDateFormat formatter = new SimpleDateFormat("MM"); 
    String CurMonth = formatter.format(anotherCurDate); 

    int Int = Integer.parseInt(CurMonth); 

    int MonthInt = Int -1; 


    CurMonth = (String) (String.valueOf(MonthInt)); 



    if (CurMonth.equals("1")){ 

     lastMonth = "12"; 

    }  
    else { 
     if(CurMonth.length() < 2){ 
      lastMonth = "0" + CurMonth; 
     } else { 
      lastMonth = CurMonth; 
     } 
    } 

    Log.v("lc","month= " + CurMonth); 
    Log.v("lc","LastMonth= " + lastMonth); 


     HttpClient client = new DefaultHttpClient(); 
     HttpPost post = new HttpPost(resultsFeedURL); 

     List<NameValuePair> pairs = new ArrayList<NameValuePair>(); 
     pairs.add(new BasicNameValuePair("requestToken", myhash)); 
     pairs.add(new BasicNameValuePair("apiUser", apiUser)); 

     try { 
      post.setEntity (new UrlEncodedFormEntity(pairs)); 
      HttpResponse response = client.execute(post); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8")); 
      String json = reader.readLine(); 
      fulldata = String.valueOf(json); 
      Log.v("myApp","resultsdata" + fulldata); 

      newsList = new ArrayList<String>(); 
      newsList2 = new ArrayList<String>(); 
      newsList3 = new ArrayList<String>(); 
      imageList = new ArrayList<String>(); 


      JSONObject obj = new JSONObject(json);  
      JSONObject objData = obj.getJSONObject("data"); 
      JSONArray jArray = objData.getJSONArray("results"); 


       for(int t = 0; t < 1; t++){ 

        resultsDict = jArray.getJSONObject(t); 
        HomeTeam = resultsDict.getString("hometeam"); 
        AwayTeam = resultsDict.getString("awayteam"); 
        HomeScore = resultsDict.getString("homescore"); 
        AwayScore = resultsDict.getString("awayscore"); 
        Attendance = resultsDict.getString("attendance"); 
        Division = resultsDict.getString("division"); 

        Log.v("lc","hometeam" + HomeTeam); 
        Log.v("lc","awayteam" + AwayTeam); 


       } 


     } catch (ClientProtocolException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


    } 


public class PostTask extends AsyncTask<Void, String, Boolean> { 

    @Override 
    protected Boolean doInBackground(Void... params) { 
     boolean result = false; 
     loadNewsFeed(); 
     loadResultsFeed(); 
     loadLastResults(); 
     publishProgress("progress"); 
     return result; 
    } 

    protected void onProgressUpdate(String... progress) { 
     StringBuilder str = new StringBuilder(); 
      for (int i = 1; i < progress.length; i++) { 
       str.append(progress[i] + " "); 
      } 
    } 

} 

public void FillData(){ 


    if (ChosenMethod.equals("Team")) { 


     resultsView = LayoutInflater.from(getBaseContext()).inflate(R.layout.resultscell, 
       null); 

     TextView homeTeam = (TextView) resultsView.findViewById(R.id.HomeTeam); 
     homeTeam.setText(HomeTeam); 

     TextView awayTeam = (TextView) resultsView.findViewById(R.id.AwayTeam); 
     awayTeam.setText(AwayTeam); 

     TextView homeScore = (TextView) resultsView.findViewById(R.id.HomeScore); 
     homeScore.setText(HomeScore); 

     TextView awayScore = (TextView) resultsView.findViewById(R.id.AwayScore); 
     awayScore.setText(AwayScore); 

     TextView attendance = (TextView) resultsView.findViewById(R.id.Attendence); 
     attendance.setText("Att:" + Attendance); 

     TextView division = (TextView) resultsView.findViewById(R.id.Division); 
     division.setText(Division); 

     arrayAdapter = new ArrayAdapter<String>(this, R.layout.single_item, newsList); 

     String[] mStrings = (String[]) imageList.toArray(new String[imageList.size()]); 
     String[] news = (String[]) newsList3.toArray(new String[newsList3.size()]); 

     arrayAdapter3 = new LazyAdapter(this, mStrings, news); 


      ListView list = getListView(); 
       list.setTextFilterEnabled(true); 

       LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       View header = inflater.inflate(R.layout.homeheader, list, false); 
       View header2 = inflater.inflate(R.layout.homeheader2, list, false); 
       View header3 = inflater.inflate(R.layout.homeheader3, list, false); 


     //setListAdapter (arrayAdapter); 


      adapter = new MergeAdapter(); 
      adapter.addView(header); 
      adapter.addAdapter(arrayAdapter); 
      adapter.addView(header2); 
      adapter.addView(resultsView); 
      adapter.addView(header3); 
      adapter.addAdapter(arrayAdapter3); 
      setListAdapter(adapter); 



    } else { 

     arrayAdapter = new ArrayAdapter<String>(this, R.layout.single_item, newsList); 
      arrayAdapter2 = new ArrayAdapter<String>(this, R.layout.single_item, newsList2); 
      //arrayAdapter3 = new ArrayAdapter(this, R.layout.complex_item, newsList3); 

      String[] mStrings = (String[]) imageList.toArray(new String[imageList.size()]); 
      String[] news = (String[]) newsList3.toArray(new String[newsList3.size()]); 


      arrayAdapter3 = new LazyAdapter(this, mStrings, news); 


       ListView list = getListView(); 
        list.setTextFilterEnabled(true); 

        LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
        View header3 = inflater.inflate(R.layout.homeheader3, list, false); 


      //setListAdapter (arrayAdapter); 


       adapter = new MergeAdapter(); 
       adapter.addView(header3); 
       adapter.addAdapter(arrayAdapter3); 
       setListAdapter(adapter); 
     } 
} 

回答

3

盲目假设......! (如果没有堆栈跟踪报告)

实现你的AsyncTaskonPostExecute()并把FillData()方法吧..当你的doInBackground() ..完成控制进来onPostExecute()自动..然后填写你的UI部分..

+0

+1简短而亲切的信息。 –

+0

不是android文档说不从不同的线程访问UI吗? –

+0

@DielsonSales - 只有在'doInBackground()'方法中,您不能访问UI作为它在工作线程上运行,其他方法在相同的UI线程上运行。 – user370305

0

,您应该使用的AsyncTask的另一种方法。 (下载后的结果+“字节”);}} }

用于更新UI。

3

打电话给你FillData()方法里面onPostExecute Method of AsyncTask

应该是::

public class PostTask extends AsyncTask<Void, String, Boolean> { 

    @Override 
    protected Boolean doInBackground(Void... params) { 
     boolean result = false; 
     loadNewsFeed(); 
     loadResultsFeed(); 
     loadLastResults(); 
     publishProgress("progress"); 
     return result; 
    } 


    protected void onProgressUpdate(String... progress) { 
     StringBuilder str = new StringBuilder(); 
      for (int i = 1; i < progress.length; i++) { 
       str.append(progress[i] + " "); 
      } 
    } 

     @Override 
    protected void onPostExecute(Boolean result) { 
     super.onPostExecute(result); 

     fillData(); 
    } 
} 
+0

+1对用户有帮助的例子。恭喜提前10k里程碑:) –

+0

@PareshMayani thnx ... –

+0

@SamirMangroliya在Eclipse中,即时通讯上得到一个错误执行它的说法,我应该改变类型结果布尔值或更改postexecute执行。我该怎么办? –

0

您可以使用ProgressDialog,直到从服务器发出的完整数据到达您的末端并填充数据。请参阅this

让我知道是否有任何问题。

谢谢,

Haps。

0

添加方法asynctask

public void onPostExecute(Void result){} 

,并在其中驳回对话,并致电fillData()

相关问题