2014-09-29 42 views
1

我目前正在学习IO和异步,但遇到问题。我遵循指南,并根据指南,这应该工作。我用一个简单的EditText,TextView和2个按钮(保存并加载)创建了一个活动。我正在尝试让保存按钮将EditText中的文本保存到内部存储中,并且加载按钮将保存的任何内容设置为该TextView。当我将所有代码放到UI线程中运行时,所有东西都完美无缺地工作,但如果我更改代码以使UI线程调用加载的Async类,则似乎没有任何事情发生。Android应用程序异步无法加载内部数据

**包和导入已被删除以节省空间。

public class InternalData extends Activity implements OnClickListener { 

EditText etSharedData; 
TextView tvDataResults; 
FileOutputStream fos; 
String FILENAME = "InternalString"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.sharedpreferences); 
    setupVariables(); 
} 

private void setupVariables() { 
    Button bSave = (Button) findViewById(R.id.bSave); 
    Button bLoad = (Button) findViewById(R.id.bLoad); 
    etSharedData = (EditText) findViewById(R.id.etSharedPrefs); 
    tvDataResults = (TextView) findViewById(R.id.tvLoadSharedPrefs); 
    bSave.setOnClickListener(this); 
    bLoad.setOnClickListener(this); 
    try { 
     fos = openFileOutput(FILENAME, Context.MODE_PRIVATE); 
     fos.close(); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 
    switch (v.getId()) { 
    case R.id.bSave: 
     String sData = etSharedData.getText().toString(); 
     try { 
      fos = openFileOutput(FILENAME, Context.MODE_PRIVATE); 
      fos.write(sData.getBytes()); 
      fos.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     break; 
    case R.id.bLoad:  
     String sCollected = null; 
     FileInputStream fis = null; 
     try { 
      fis = openFileInput(FILENAME); 
      byte[] dataArray = new byte[fis.available()]; 
      while(fis.read(dataArray) != -1){ 
       sCollected = new String(dataArray); 
      } 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } finally{ 
      try { 
       fis.close(); 
       tvDataResults.setText(sCollected); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

     break; 
    } 
} 

前面的代码使一切正常,但UI在尝试加载大型字符串时会稍微滞后。当我尝试让LoadSomeStuff(Async)类执行加载时,当我在手机上点击Load时,它完全没有任何问题。在LoadSomeStuff类中,它有doInBackground方法打开文件并将数据读入字符串,然后返回该字符串,onPostExecute方法将TextView的文本设置为返回的字符串。下面的代码:

负载按钮的onclick方法有:

new LoadSomeStuff().execute(FILENAME); 

LoadSomeStuff类*注:这个类的InternalData类中声明。

public class LoadSomeStuff extends AsyncTask<String, Integer, String>{ 

    @Override 
    protected String doInBackground(String... arg0) { 
     // TODO Auto-generated method stub 
     String sCollected = null; 
     FileInputStream fis = null; 
     try { 
      fis = openFileInput(FILENAME); 
      byte[] dataArray = new byte[fis.available()]; 
      while(fis.read(dataArray) != -1){ 
       sCollected = new String(dataArray); 
      } 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } finally{ 
      try { 
       fis.close(); 
       return sCollected; 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     return null; 
    } 

    protected void onPostExecute(String result){ 
     tvDataResults.setText(result); 
    } 
} 

}

任何帮助非常感谢,谢谢!

回答

0

它实际上看起来像我有一个或两个额外的方法(如onPreExecute)没有代码,当我删除它开始工作。

相关问题