2013-10-30 46 views
0

我有我的,看起來這個。接收傳遞的字符串

   @Override 
       public void onClick(View v) { 
       ...... 

       String searchTerm = et.getText().toString().trim();   
       Intent in = new Intent(PassingString.this, RecieveString.class); 
       in.putExtra("TAG_SEARCH", searchTerm); 
       startActivity(in); 

在我的其他活動的活動傳遞一個字符串這是我收到此字符串,並將其編碼到我的網頁地址。 (et只是我的情況下,EDITTEXT你在哪裏知道)

 @Override 
     protected JSONObject doInBackground(String... args) { 
      .... 

       Intent in = getIntent(); 
       String searchTerm = in.getStringExtra("TAG_SEARCH"); 
       String query = URLEncoder.encode(searchTerm, "utf-8"); 
       String URL = "http://example.com"+ query + "json"; 

我試圖移動代碼獲得這個串出我的doInbackGround方法時速度變慢它只是當我移動Intent in = getIntent();String searchTerm = in.getStringExtra("TAG_SEARCH");onCreate的我在searchTerm(asynctask中的那個)下面出現語法錯誤,該錯誤說「searchTerm無法解析爲變量」。我曾試過宣稱Intent in = getIntent();String searchTerm = in.getStringExtra("TAG_SEARCH");final但它沒有改變任何東西。我甚至試過把它放入onPreExecute,但它仍然沒有改變任何東西。所以,可以請人幫我解決這個殺手語法錯誤

這裏是我收到

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //setContentView(R.layout.listview);   

     Intent in = getIntent(); 
     String searchTerm = in.getStringExtra("TAG_SEARCH"); 

     questionList = new ArrayList<HashMap<String, String>>(); 

    mTask = new LoadAllData(); 

     mTask.execute(); 

     }  

    @Override 
    public void onBackPressed() 
    {    
     /** If user Pressed BackButton While Running Asynctask 
      this will close the ASynctask. 
     */ 
     if (mTask != null && mTask.getStatus() != AsyncTask.Status.FINISHED) 
     { 
      mTask.cancel(true); 
     }   
     super.onBackPressed(); 

    } 


    @Override 
    protected void onDestroy() { 

    if (mTask != null && mTask.getStatus() != AsyncTask.Status.FINISHED) 
    { 
     mTask.cancel(true); 
     } 

     super.onDestroy(); 

    } 

    @Override 
    protected void onPause() { 

    if (pDialog != null) 
    { 
     if(pDialog.isShowing()) 
     { 
      pDialog.dismiss(); 
     } 
      super.onPause(); 

     } 
} 

    class LoadAllData extends AsyncTask<String, Void, JSONObject> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute();    
      pDialog = new ProgressDialog(ListView.this); 
      pDialog.setMessage("Loading Data. Please wait..."); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(true); 
      pDialog.show();   
} 
     @Override 
     protected JSONObject doInBackground(String... args) { 

      JSONObject json = new JSONObject(); 
      try { 

       String query = URLEncoder.encode(searchTerm, "utf-8"); 
       String URL = "http://example.com"+ query + "json"; 
       JSONParsser jParser = new JSONParsser(); 

        json = jParser.readJSONFeed(URL); 
       } catch (UnsupportedEncodingException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

       return json;   

      } 
+0

它將幫助,如果你添加修改後的代碼塊,因此我們可以更清楚地看到,並按照您的更改。 –

+0

感謝您發佈您的代碼,我更新了我的答案。 –

回答

1

您試圖定義一個方法中的一個元素,並在另一種方法,使用它的字符串其活性是scope的錯誤使用。在類級定義字段,並且可以在兩種方法中使用它 - 假設您的AsyncTask是此Activity的內部類(即它在同一個文件中)。

private String searchTerm; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    [...] 
    searchTerm = getIntent().getStringExtra("TAG_SEARCH"); 
} 

@Override 
protected JSONObject doInBackground(String... args) { 
    [...] 
    String query = URLEncoder.encode(searchTerm, "utf-8"); 
} 

編輯:感謝您發佈代碼 - 您設置的方式,您應該只是將字符串作爲變量傳遞給執行方法。然後,你可以通過訪問args數組訪問它在doInBackground方法:

@Override 
protected JSONObject doInBackground(String... args) { 
    [...] 
    String searchTerm = args[0]; 
    String query = URLEncoder.encode(searchTerm, "utf-8"); 
} 
+0

如果它們實際上是在兩個單獨的類中,我經常採用創建由靜態變量組成的第三類,我可以在任何範圍內使用 – mike

+0

您可能會遇到問題 - 在Android中,有很多將變量傳遞給不同組件並維護狀態的方法,並且通過使用靜態變量,您可能會遇到在應用程序處於空閒狀態時垃圾回收變量的風險,從而在用戶恢復應用程序時導致崩潰。 –

+0

感謝您的鏈接和您的幫助! –